package com.chenziwen.scala.chapter05;

/**
 * @ClassName TestJavaDynamicBind
 * @Description
 * @Author Administrator
 * @Date 2019/10/17 14:33
 * @Version 1.0
 **/
public class TestJavaDynamicBind {
    public static void main(String[] args) {

        // 动态绑定技术
        // 在运行过程中，调用对象的成员方法，JVM会将当前调用的方法和对象的实际内存进行绑定

        A a = new A();
        // 结果是：20
        System.out.println(a.sum());
        B b = new B();
        // 结果是：40
        System.out.println(b.sum());
        A c = new B();
        // 结果是：40
        System.out.println(c.sum());

        A d = new C();
        // 此种情况：当子类对象的内存中没有这个方法时，那么JVM会帮我们去父类的内存中去找这个方法，如果有，那么会调用父类的这个方法
        // 成员属性没有动态绑定技术，在哪里声明，在哪里使用，所以此处的i=10(10+10=20)
        // 从另一个角度看，父类中是不可能使用子类中的属性或方法的
        // 结果是：20
        System.out.println(d.sum());

        E e = new D();
        // 结果是：30
        System.out.println(e.sum());
    }
}

class A {
    public int i = 10;

    public int sum() {
        return i + 10;
    }

    public int getI() {
        return i;
    }
}

class B extends A {
    public int i = 20;

    @Override
    public int sum() {
        // 其实Java中此处省略了this.i，this这个关键字的（所以，这种情况下i=20）
        return i + 20;
    }
}

class C extends A {
    public int i = 20;

}

class E {
    public int i = 10;

    public int sum() {
        return getI() + 10;
    }

    public int getI() {
        return i;
    }
}

class D extends E {
    public int i = 20;

    @Override
    public int getI() {
        return i;
    }
}